package cn.tedu.ivos.base.file;

import cn.tedu.ivos.base.response.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@RestController
@RequestMapping("/v1/file")
@Slf4j
public class UploadController {
    @PostMapping("upload")
    // `MultipartFile`用于接收上传文件的对象 形参名`file`必须与前端upload组件的`name`的值保持一致
    public JsonResult upload(MultipartFile file) throws IOException {
        // 1.得到原始文件名
        String fileName = file.getOriginalFilename();
        // 2.获取原始文件名中的后缀名 - 利用截取后缀名与文件名之间链接的符号"."获取后缀名
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        // 3.生成一串唯一的随机字符串作为文件名 - 利用UUID工具的方法
        fileName = UUID.randomUUID() + suffix;
        // 4.指定一个磁盘文件夹用来存储上传的图片文件 注意 这个路径得自己电脑上有
        String dirPath = "e:/files";
        // 5.为提高检索性能 可以设置一个自定义日期路径文件夹分层存储图片文件
        //   SimpleDateFormat 工具 帮助指定日期路径格式 例如 2022/03/28
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("/yyyy/MM/dd/");
        // 6.按照当前实际日期 使用上述格式生成日期路径
        String datePath = simpleDateFormat.format(new Date());
        // 7.创建一个封装了上述路径的file对象
        File dirFile = new File(dirPath + datePath);// 注意 此处只是创建了一个java类型的文件夹 并非真实的文件夹
        // 8.判断文件夹是否存在 若不存在 则创建该文件夹
        if (!dirFile.exists()) {
            dirFile.mkdirs();// 创建多层文件夹
        }
        // 9.定义一个完整的图片路径 文件夹路径+日期路径+完整文件名
        String filePath = dirPath + datePath + fileName;
        // 10.将用户上传的图片文件保存在指定路径下 - 注意此步需要处理异常: 在方法上将异常抛出
        file.transferTo(new File(filePath));
        // 11.将 日期路径+图片名 响应给前端 前端获得此路径后进行图片回显 不添加完整路径的原因为: 便于服务器更换后利用拼接方式拼接新路径
        return JsonResult.ok(datePath + fileName);
    }

    /**
     * 添加删除图片的方法
     */
    @PostMapping("remove")
    public JsonResult remove(String imgUrl) {
        System.out.println("imgUrl:"+imgUrl);// imgUrl:/2024/06/17/1ca60c58-c329-4099-b00d-6831284752ff.jpg
        new File("e:/files"+imgUrl).delete();
        return JsonResult.ok();
    }
}
